home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / Software / More Shareware⁄Freeware / NIH Image 1.55 f (non fpu) / Macros / Plotting Macros < prev    next >
Text File  |  1994-02-17  |  9KB  |  369 lines

  1. macro 'Plot Histogram';
  2. var
  3.   max,scale:real;
  4.   i,margin,width,height:integer;
  5. begin
  6.   SaveState;
  7.   Margin:=10;
  8.   width:=256;
  9.   height:=0.6*256;
  10.   Measure;
  11.   SetForegroundColor(255);
  12.   SetBackgroundColor(0);
  13.   SetLineWidth(1);
  14.   SetNewSize(width+2*margin,height+2*margin);
  15.   MakeNewWindow('Histogram');
  16.   MakeRoi(margin,margin-1,width,height+1);
  17.   DrawBoundary;
  18.   max:=0;
  19.   for i:=1 to 254 do
  20.   if histogram[i]> max then max:=histogram[i];
  21.   scale:=height/max;
  22.   for i:=1 to 254 do begin
  23.     MakeRoi(margin+i,margin,1,histogram[i]*scale);
  24.     SetForegroundColor(i);
  25.     fill;
  26.  end;
  27.   SelectAll;
  28.   FlipVertical;
  29.   KillRoi;
  30.   RestoreState;
  31. end;
  32.  
  33. macro 'Plot XY Coordinates';
  34. {Plots the X-Y Coordinates of the current ROI.}
  35. var
  36.   i,w,h,width,height:integer;
  37.   xbase,ybase,RoiWidth,RoiHeight:integer
  38.   x,y,scale,xmax,ymax:real 
  39. begin
  40.   RequiresVersion(1.48);
  41.   if nCoordinates=0 then begin
  42.     PutMessage('No XY-Coordinates currently available.');
  43.     exit;
  44.   end;
  45.   GetRoi(xbase,ybase,RoiWidth,RoiHeight);
  46.   SaveState;
  47.   InvertY(false);
  48.   xmax:=0;
  49.   ymax:=0;
  50.   for i:=1 to nCoordinates do begin
  51.     x:=xCoordinates[i];
  52.     y:=yCoordinates[i];
  53.     if x>xmax then xmax:=x;
  54.     if y>ymax then ymax:=y;
  55.   end;
  56.   scale:=sqrt((300*300)/(xmax*ymax));
  57.   if (xmax*scale)>500 then scale:=500/xmax;
  58.   if (ymax*scale)>500 then scale:=500/ymax;
  59.   SetForegroundColor(255);
  60.   SetBackgroundColor(0);
  61.   SetNewSize(xmax*scale+20,ymax*scale+20);
  62.   MakeNewWindow('Outline');
  63.   MoveTo(xCoordinates[1]*scale+10,yCoordinates[1]*scale+10);
  64.   for i:=2 to nCoordinates do
  65.     LineTo(xCoordinates[i]*scale+10,yCoordinates[i]*scale+10);
  66.   SetFont('Helvetica');
  67.   SetFontSize(12);
  68.   SetText('No background, Center');
  69.   GetPicSize(width,height);
  70.   MoveTo(width/2,height/3);
  71.   Writeln(nCoordinates:1,' coordinate pairs');
  72.   Writeln('Origin=',xbase:1,',',ybase:1);
  73.   RestoreState;
  74. end;
  75.  
  76.  
  77. procedure PlotProfile2(integrate:boolean);
  78. var
  79.   xmin,xmax,ymin,ymax,i,xscale,yscale:real;
  80.   width,height,margin,pwidth,pheight:integer;
  81.   count:integer;
  82.   ppv:integer; {Pixels per Value}
  83. begin
  84.   SaveState;
  85.   margin:=40;
  86.   width:=500;
  87.   height:=300;
  88.   GetPlotData(count,ppv,ymin,ymax);
  89.   if count=0 then begin
  90.     PutMessage('No plot data available.');
  91.     exit;
  92.   end;
  93.   if integrate then begin
  94.      ymin:=ymin*ppv;
  95.      ymax:=ymax*ppv;
  96.   end;
  97.   xmin:=0;
  98.   xmax:=count-1;
  99.   SetNewSize(width,height);
  100.   SetForeground(255);
  101.   SetBackground(0);
  102.   MakeNewWindow('Plot');
  103.   pwidth:=width-2*margin;
  104.   pheight:=height-2*margin;
  105.   xscale:=pwidth/(xmax-xmin);
  106.   yscale:=pheight/(ymax-ymin);
  107.   SetForeground(255);
  108.   SetBackground(0); 
  109.   SetLineWidth(1); 
  110.   MoveTo(margin,margin);
  111.   if integrate then for i:=0 to count-1 do
  112.        LineTo(margin+i*xscale,margin+(PlotData[i]*ppv-ymin)*yscale)
  113.   else  for i:=0 to count-1 do
  114.         LineTo(margin+i*xscale,margin+(PlotData[i]-ymin)*yscale);
  115.   MakeRoi(margin,margin,pwidth+1,pheight+2);
  116.   MoveTo(margin,margin);
  117.   LineTo(margin+pwidth,margin);
  118.   MoveTo(margin,margin);
  119.   LineTo(margin,margin+pheight);
  120.   FlipVertical;
  121.   KillRoi;
  122.   SetFont('Geneva');
  123.   SetFontSize(9);
  124.   SetText('Centered');
  125.   MoveTo(margin+4,margin+pheight+12);
  126.   writeln(xmin:1:2);
  127.   MoveTo(margin+pwidth,margin+pheight+12);
  128.   writeln(xmax:1:2);
  129.   SetText('Right Justified');
  130.   MoveTo(margin-2,margin+pheight-5);
  131.   writeln(ymin:1:2);
  132.   MoveTo(margin-2,margin);
  133.   writeln(ymax:1:2);
  134.   RestoreState;
  135. end;
  136.  
  137.  
  138. macro 'Plot Profile';
  139. begin
  140.   PlotProfile2(false);
  141. end;
  142.  
  143. macro 'Plot Integrated Profile';
  144. begin
  145.   PlotProfile2(true);
  146. end;
  147.  
  148. macro 'Plot Radial Density Profiles [R]';
  149. var
  150.   x1,y1,x2,y2,pi,angle,delta:real;
  151.   LineWidth,i,nLines,radius,PlotWidth,PlotHeight:integer;
  152.   MinPlotWidth,hMargin,vMargin,PlotLeft,PlotTop:integer;
  153.   LeftMargin,RightMargin,TopMargin,BottomMargin:integer;
  154.   ImageWindow,PlotWindow:integer;
  155.   nPixels,mean,mode,min,max:real;
  156. begin
  157.   RequiresVersion(1.54);
  158.   SaveState;
  159.   GetLine(x1,y1,x2,y2,LineWidth);
  160.   if x1<0 then begin
  161.     PutMessage('Please select a point by clicking with the line tool.');
  162.     exit;
  163.   end;
  164.   radius:=GetNumber('Radius:',20);
  165.   nLines:=GetNumber('Number of Lines:',8);
  166.   MinPlotWidth:=140;
  167.   pi:=3.14159;
  168.   delta:=2.0*pi/nLines;
  169.   angle:=0.0;
  170.   PlotWidth:=radius;
  171.   if PlotWidth<MinPlotWidth then PlotWidth:=MinPlotWidth;
  172.   PlotHeight:=0.4*PlotWidth;
  173.   SetPlotSize(PlotWidth,PlotHeight);
  174.   MakeOvalRoi(x1-radius,y1-radius,radius*2,radius*2);
  175.   Measure;
  176.   GetResults(nPixels,mean,mode,min,max);
  177.   min:=min-10;
  178.   if min<0 then min:=0;
  179.   max:=max+10;
  180.   if max>255 then max:=255;
  181.   SetPlotScale(cValue(min),cValue(max));
  182.   SetPlotLabels(false);
  183.   hMargin:=5;
  184.   vMargin:=5;
  185.   LeftMargin:=38;
  186.   TopMargin:=10;
  187.   RightMargin:=20;
  188.   BottomMargin:=20;
  189.   PlotLeft:=hMargin-LeftMargin;
  190.   PlotTop:=vMargin-TopMargin;
  191.   SetNewSize(PlotWidth+2*hMargin,PlotHeight*nLines);
  192.   SetForegroundColor(255);
  193.   SetBackgroundColor(0);
  194.   ImageWindow:=PicNumber;
  195.   MakeNewWindow('Plots');
  196.   PlotWindow:=PicNumber;
  197.   SelectPic(ImageWindow);
  198.   for i:=1 TO nLines do begin
  199.     x2:=x1+round(radius*cos(angle));
  200.     y2:=y1+round(radius*sin(angle));
  201.     MakeLineRoi(x1,y1,x2,y2);
  202.     PlotProfile;
  203.     Copy;
  204.     SelectPic(PlotWindow);
  205.     MakeRoi(PlotLeft,PlotTop,PlotWidth+LeftMargin+RightMargin,
  206.           PlotHeight+TopMargin+BottomMargin);
  207.     Paste;
  208.     DoOr;
  209.     PlotTop:=PlotTop+PlotHeight-1;
  210.     SelectPic(ImageWindow);
  211.     angle:=angle+delta;
  212.   end;
  213.   RestoreState;
  214. end;
  215.  
  216.  
  217. macro 'Circular Profile Plot [C]';
  218. var
  219.   radius,pi,angle,dx,dy,delta:real;
  220.   x1,y1,x2,y2:real;
  221.   npoints,i,value,LineWidth,x,y,px:integer;
  222. begin
  223.   GetLine(x1,y1,x2,y2,LineWidth)
  224.   if x1<0 then begin
  225.     PutMessage('Please select a point by clicking with the line tool.');
  226.     exit;
  227.   end;
  228.   x:=x1+(x2-x1)/2;
  229.   y:=y1+(y2-y1)/2;
  230.   radius:=sqrt(sqr(x2-x1)+sqr(y2-y1))/2;
  231.   if radius<3 then begin
  232.     PutMessage('The line selection must be longer than 5 pixels.');
  233.     exit;
  234.   end;
  235.   npoints:=radius*2;
  236.   pi:=3.14159;
  237.   delta:=2.0*pi/npoints;
  238.   angle:=0.0;
  239.   px:=0;
  240.   for i:=1 TO npoints do begin
  241.     dx:=round(radius*cos(angle));
  242.     dy:=round(radius*sin(angle));
  243.     value:=GetPixel(x+dx,y+dy);
  244.     PutPixel(x+dx,y+dy,255);
  245.     PutPixel(px,0,value);
  246.     px:=px+1;
  247.     angle:=angle+delta;
  248.   end;
  249.   MakeLineRoi(0,0,npoints,0);
  250.   PlotProfile;
  251.   KillRoi;
  252. end;
  253.  
  254. macro 'Export Profile Plots…';
  255. var
  256.   y,yInc,width,height,n:integer;
  257. begin
  258.   yInc:=GetNumber('Y Increment:',10);
  259.   GetPicSize(width,height);
  260.   y:=0;
  261.   n:=0;
  262.   SetExport('Plot Values');
  263.   repeat
  264.     MakeLineRoi(0,y,width-1,y);
  265.     PlotProfile;
  266.     Export('PLOT',n:4);
  267.     n:=n+1;
  268.     y:=y+yInc;
  269.   until y>=height;
  270. end;
  271.  
  272.  
  273. procedure PlotMeans;
  274. {Plots the mean column in the Results table.}
  275. var
  276.    xmin,xmax,ymin,ymax,i,xscale,yscale:real;
  277.   width,height,margin,pwidth,pheight:integer;
  278.   y,pbottom:integer;
  279. begin
  280.   margin:=40;
  281.   width:=500;
  282.   height:=300;
  283.   ymax:=-999999;
  284.   ymin:=999999;
  285.   for i:=1 to rCount do begin
  286.     y:=rMean[i];
  287.     if y>ymax then ymax:=y;
  288.     if y<ymin then ymin:=y;
  289.   end;
  290.   xmin:=0;
  291.   xmax:=rCount-1;
  292.   SetNewSize(width,height);
  293.   SetForeground(255);
  294.   SetBackground(0);
  295.   MakeNewWindow('Z-Axis Profile Plot');
  296.   pwidth:=width-2*margin;
  297.   pheight:=height-2*margin;
  298.   pbottom:=margin+pheight;
  299.   xscale:=pwidth/(xmax-xmin);
  300.   yscale:=pheight/(ymax-ymin);
  301.   SetForeground(255);
  302.   SetBackground(0); 
  303.   SetLineWidth(1);
  304.   MoveTo(margin,pbottom-(rMean[1]-ymin)*yscale);
  305.   for i:=2 to rCount do
  306.      LineTo(margin+(i-1)*xscale,pbottom-(rMean[i]-ymin)*yscale);
  307.   MoveTo(margin,pbottom);
  308.   LineTo(margin+pwidth,pbottom);
  309.   MoveTo(margin,margin);
  310.   LineTo(margin,margin+pheight);
  311.   SetFont('Geneva');
  312.   SetFontSize(9);
  313.   SetText('Centered');
  314.   MoveTo(margin+4,margin+pheight+12);
  315.   writeln(xmin:1:2);
  316.   MoveTo(margin+pwidth,margin+pheight+12);
  317.   writeln(xmax:1:2);
  318.   SetText('Right Justified');
  319.   MoveTo(margin-2,margin+pheight-5);
  320.   writeln(ymin:1:2);
  321.   MoveTo(margin-2,margin);
  322.   writeln(ymax:1:2);
  323. end;
  324.  
  325. macro 'Plot Z-Axis Profile [Z]';
  326. {Plots the average density of an roi through a stack.}
  327. var
  328.   left,top,width,height,i:integer;
  329. begin
  330.   if (nPics=0) or (nSlices=0) then begin
  331.      PutMessage('This macro requires a stack.');
  332.      exit;
  333.   end;
  334.   GetRoi(left,top,width,height);
  335.   if width=0 then begin
  336.      PutMessage('Selection required.');
  337.      exit;
  338.   end;
  339.   ResetCounter;
  340.   {SetOptions('Mean');}
  341.   for i:= 1 to nSlices do begin
  342.      SelectSlice(i);
  343.      Measure;
  344.   end;
  345.   PlotMeans;
  346.  end;
  347.  
  348.  
  349. macro 'Plot XYZ';
  350. {
  351. Plots X-Y coordinate points with an optional intensity(Z). Values are read from
  352. a 2 or 3 column tab-delimited text file. Data must be scaled as follows:
  353. 0<=X<width; 0<=Y<height; 0<=Z<=255.
  354. }
  355. var
  356.   width,height:integer;
  357. begin
  358.   SaveState;
  359.   width:=500;
  360.   height:=500;
  361.   SetNewSize(width,height);
  362.   SetForeground(255);
  363.   SetBackground(0);
  364.   MakeNewWindow('Plot');
  365.   PlotXYZ;
  366.   RestoreState;
  367. end;
  368.  
  369.